package com.myGis.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;


//import org.apache.commons.lang.StringUtils;

/**
 * @author lfantin
 */
public class FormatUtils {

	protected static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("dd-MMM-yyyy");
	protected static final SimpleDateFormat DATE_FORMATTER_MONTH_YEAR = new SimpleDateFormat("MMM-yyyy");
	protected static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
    protected static final String CURRENCY_FORMAT = "###,##0.00";
    protected static final String CURRENCY_FORMAT_UF = "###,##0.00";
    protected static final String CURRENCY_FORMAT_UF_SEIS = "###,##0.000000";
    protected static final String CURRENCY_FORMAT_UF_CUATRO = "###,##0.0000";
    protected static final String CURRENCY_FORMAT_NOT_DECIMAL = "###,###.###";
    protected static final String FORMATO_MILES = "#,##0";
    protected static final java.text.DecimalFormat MILES_FORMATTER = new java.text.DecimalFormat(FORMATO_MILES);
    protected static final java.text.DecimalFormat CURRENCY_FORMATTER = new java.text.DecimalFormat(CURRENCY_FORMAT);
    protected static final java.text.DecimalFormat CURRENCY_FORMATTER_UF = new java.text.DecimalFormat(CURRENCY_FORMAT_UF);
    protected static final java.text.DecimalFormat CURRENCY_FORMATTER_UF_SEIS = new java.text.DecimalFormat(CURRENCY_FORMAT_UF_SEIS);
    protected static final java.text.DecimalFormat CURRENCY_FORMATTER_UF_CUATRO = new java.text.DecimalFormat(CURRENCY_FORMAT_UF_CUATRO);
    protected static final java.text.DecimalFormat CURRENCY_FORMATTER_NOT_DECIMAL = new java.text.DecimalFormat(CURRENCY_FORMAT_NOT_DECIMAL);
    protected static final DecimalFormat DF6 = new DecimalFormat("000000");
    protected static final DecimalFormat DF4 = new DecimalFormat("0000");
    protected static final Integer MAX_LONG_NRO_CUENTA = 6;
    protected static final Integer MAX_LONG_NRO_TARJETA = 4;
    protected static final String GUION = "-";
    protected static final String HRS = " hrs.";
    protected static final SimpleDateFormat FILE_NAME_FORMATTER = new SimpleDateFormat("dd-MM-yyyy_HH.mm.ss");
    protected static final SimpleDateFormat DATE_FORMATTER_DAY_MONTH_YEAR_HH_MM_SS = new SimpleDateFormat("dd/MM/yyyy - HH:mm:ss");
    
    /**
     * Metodo de sobrecarga para precargar el lenguaje regional default. y no tener problemas 
     * al momento de pruebas con la configuracion regional es o en.
     * @hvillegassepulveda
     */
    //Se comenta linea para probar si se solucionan los problemas con los acentos.
//    private FormatUtils(){
//		Locale locale = Locale.getDefault();
//		   // Setting default locale  
//		   locale = Locale.GERMAN;
//		   Locale.setDefault(locale);
//    }

//  ~ Instance fields ----------------------------------------------------------------------------
    /**
     * Formatea una fecha a dd-mmm-yyy
     * @param fecha
     * @return fecha formateada
     */
    public static String formatFecha(Date fecha) {
        if ((fecha != null) && !fecha.equals("")) {
            return DATE_FORMATTER.format(fecha);
        }

        return "";
    }
    /**
     * Formatea una fecha a dd/mmm/yyy
     * @param fecha
     * @return fecha formateada
     */
    public static String formatFechaBarra(Date fecha) {
        if ((fecha != null) && !fecha.equals("")) {
            return DATE_FORMAT.format(fecha);
        }

        return "";
    }
    /**
     * Formatea una fecha a MMM-yyyy
     * @param fecha
     * @return fecha formateada
     */
    public static String formatFechaMonthYear(Date fecha) {
        if ((fecha != null) && !fecha.equals("")) {
            return DATE_FORMATTER_MONTH_YEAR.format(fecha).toLowerCase();
        }

        return "";
    }
    
    /** 
     * Formatea un importe tal cual se muestra en la view.
     * @param moneda
     * @param importe
     * @param locale
     * @return importe formateado
     */
    public static String formatImporte(BigDecimal importe) {
        String importeMessage = "";
        if (importe != null) {
            importeMessage = CURRENCY_FORMATTER.format(importe);
        }

        return importeMessage;
    }

    /** TODO borrar. no se usa, ya existe formatImporte
     * 
     * Formatea un importe UF . Este se retorna con punto como separador de miles y con 2 decimales.<br>
     * Esta implementado como lo indica el documento Generalidades .<br>
     * Ej de retorno UF: 1.200,45
     * @param importe UF.
     * @return importe formateado
     */
    @Deprecated
    public static String formatImporteUF(BigDecimal importe) {
        String importeMessage = "";
        if (importe != null) {
            importeMessage = CURRENCY_FORMATTER_UF.format(importe);
        }

        return importeMessage;
    }
    
    /**
     * Formatea un importe UF con 6 decimales.
     * @param importe UF.
     * @return importe formateado
     */
    public static String formatImporteUFSeis(BigDecimal importe) {
        String importeMessage = "";
        if (importe != null) {
            importeMessage = CURRENCY_FORMATTER_UF_SEIS.format(importe);
        }

        return importeMessage;
    }
    
    /**
     * Formatea un importe tal cual se muestra en la view, pero sin decimales.
     * @param moneda
     * @param importe
     * @param locale
     * @return importe formateado sin decimal
     */
    public static String formatImporteNotDecimal(BigDecimal importe) {
        String importeMessage = "";
        if (importe != null) {
            importeMessage = CURRENCY_FORMATTER_NOT_DECIMAL.format(importe);
        }

        return importeMessage;
    }
    
    /**
     * Formatea un monto para mostrarlo con separador de miles
     * @param monto
     * @return montoFormateado formateado con separador de miles
     */
    public static String formatoMiles(BigDecimal monto) {
        String montoFormateado = "";
        if (monto != null) {
        	montoFormateado = MILES_FORMATTER.format(monto);
        }

        return montoFormateado;
    }
   
    /**
     * Formatea un numero de cuenta para ser mostrada como en la view.
     * @param numeroCuenta
     */
    public static String formatNumeroCuenta(String numeroCuenta) {
    	if (numeroCuenta==null)
    		return "";

        DF6.setMaximumIntegerDigits(MAX_LONG_NRO_CUENTA);
        return DF6.format(Long.parseLong(numeroCuenta));
    }

    /**
     * Formatea un numero de cuenta para ser mostrada en el reporte.
     * con el formato XXX-X-XXXXXX-X
     * @param numeroCuenta
     */
    public static String formatNumCuenta(String numeroCuenta) {
    	
    	int faltan = 11 - numeroCuenta.length();
        String concat = "";
        
        for (int i=0; i <faltan; i++){
                concat="0"+concat;
        }
        
        numeroCuenta = concat+numeroCuenta;
    	
    	if(numeroCuenta.length()==11){
        	numeroCuenta = numeroCuenta.substring(0, 3).concat(GUION).concat(numeroCuenta.substring(3, 4)).
        														   concat(GUION).concat(numeroCuenta.substring(4, 10)).
        														   concat(GUION).concat(numeroCuenta.substring(10,11));
    	}
    	return numeroCuenta;
    }
	/**
	 * Formatea un numero de cuenta.
	 * con el formato XXX-XX-XXXXX-X
	 * @param numeroCuenta
	 */
	public static String formatNumeroDeCuenta(String numeroCuenta) {
		
		int faltan = 11 - numeroCuenta.length();
	    String concat = "";
	    
	    for (int i=0; i <faltan; i++){
	            concat="0"+concat;
	    }
	    
	    numeroCuenta = concat+numeroCuenta;
				
		if(numeroCuenta.length()==13){
	    	numeroCuenta = numeroCuenta.substring(0, 5).concat(GUION).concat(numeroCuenta.substring(5, 7)).
					   concat(GUION).concat(numeroCuenta.substring(7, 12)).
					   concat(GUION).concat(numeroCuenta.substring(12,13));			
		}
		
		if(numeroCuenta.length()==12){
	    	numeroCuenta = numeroCuenta.substring(0, 4).concat(GUION).concat(numeroCuenta.substring(4, 6)).
					   concat(GUION).concat(numeroCuenta.substring(6, 11)).
					   concat(GUION).concat(numeroCuenta.substring(11,12));			
		}
		
		if(numeroCuenta.length()==11){
	    	numeroCuenta = numeroCuenta.substring(0, 3).concat(GUION).concat(numeroCuenta.substring(3, 5)).
					   concat(GUION).concat(numeroCuenta.substring(5, 10)).
					   concat(GUION).concat(numeroCuenta.substring(10,11));			
		}
		
		if(numeroCuenta.length()==10){
	    	numeroCuenta = numeroCuenta.substring(0, 2).concat(GUION).concat(numeroCuenta.substring(2, 4)).
					   concat(GUION).concat(numeroCuenta.substring(4, 9)).
					   concat(GUION).concat(numeroCuenta.substring(9,10));			
		}
		
		return numeroCuenta;
	}

    /** TODO borrar. No se usa
     * Formatea una tasa tal como se la muestra en la view
     * @param importe
     * @param locale
     * @return la tasa con el formato correspondiente
     */
	@Deprecated
    public static String formatTasa(BigDecimal importe, Locale locale) {

    	return formatImporte(importe)+" %";
    }
    
    public static String formatTasa(Double importe) {
    	 String importeMessage = "";
         if (importe != null) {
             importeMessage = CURRENCY_FORMATTER_UF_CUATRO.format(importe);
         }

         return importeMessage;
    	//return formatImporteUFSeis(importe, locale)+" %";
    }

    public static String formatNumeroDocumento(Long nroDocumento)	{

    	if (nroDocumento==null)
    		return "";
    	return nroDocumento.toString();
    }

    public static String formatCuenta(BigDecimal cuota){

    	if (cuota==null)
    		return "";
    	return cuota.toBigInteger().toString();
    }

    public static String formatDefault(Object obj)	{

    	if (obj==null)
    		return "";
    	return obj.toString();
    }

    /**
     * Formatea un numero de cuenta o fondo
     * basado en formatCuenta.tag
     * @param cuenta sin formato
     * @return cuenta formateada
     */
    public static String formatNroCuenta(String nroCuenta) {
    	if (nroCuenta==null)
    		return "";
    	if(nroCuenta.length() >= 11){
    		return nroCuenta.substring(0, 3)+"-"+nroCuenta.substring(3, 5)+"-"+nroCuenta.substring(5,10)+"-"+nroCuenta.substring(10,nroCuenta.length());
    	}
    	else
    		return nroCuenta;
    	
    }    

    /**
     * Formatea una fecha a dd/MM/yyyy
     * @param fecha
     * @return fecha formateada
     */
    public static String formatClassicDate(Date fecha) {
        if ((fecha != null) && !fecha.equals("")) {
            return DATE_FORMAT.format(fecha);
        }

        return "";
    }
    

    /**
     * Formatea un importe tal cual se muestra en la view.
     * @param moneda
     * @param importe
     * @return importe formateado
     */
    public static String formatImporte(Double importe) {
        String importeMessage = "";
        if (importe != null) {
            importeMessage = CURRENCY_FORMATTER.format(importe);
        }

        return importeMessage;
    }
    
    /**
     * Formatea un importe UF con 3 decimales.
     * @param importe UF
     * @return importe formateado
     */
    public static String formatImporteUF(Double importe) {
        String importeMessage = "";
        if (importe != null) {
            importeMessage = CURRENCY_FORMATTER_UF.format(importe);
        }

        return importeMessage;
    }
    
    /**
     * Formatea un importe UF con 6 decimales.
     * @param importe UF
     * @return importe formateado
     */
    public static String formatImporteUFSeis(Double importe) {
        String importeMessage = "";
        if (importe != null) {
            importeMessage = CURRENCY_FORMATTER_UF_SEIS.format(importe);
        }

        return importeMessage;
    }
 
    
    /**
     * Formatea un importe UF con separador de miles y 4 decimales.
     * @param importe UF
     * @return importe formateado
     */
    public static String formatImporteUFCuatro(Double importe) {
        String importeMessage = "";
        if (importe != null) {
            importeMessage = CURRENCY_FORMATTER_UF_CUATRO.format(importe);
        }

        return importeMessage;
    }    
    
    /**
     * Formatea un importe tal cual se muestra en la view, pero sin decimales y con punto de miles
     * <br>Ejemplo: 1000,00 queda en 1.000</br>
     * @param moneda
     * @param importe
     * @return importe formateado sin decimal
     */
    public static String formatImporteNotDecimal(Double importe) {
        String importeMessage = "";
        if (importe != null) {
            importeMessage = CURRENCY_FORMATTER_NOT_DECIMAL.format(importe);
        }

        return importeMessage;
    }
    
    /**
     * Metodo utilizado par las exportaciones.
     * Formatea una fecha a dd-MM-yyyy_HH.mm.ss
     * @param fecha
     * @return fecha format     * @author hvillegassepulveda, Gustavo Villegas, Technisys Chile.
eada
     */
    public static String formatFileName(Date fecha) {
        if ((fecha != null) && !fecha.equals("")) {
            return FILE_NAME_FORMATTER.format(fecha);
        }

        return "";
    }
    
    /**
     * Metodo utizado para las exportaciones, comprobantes.
     * Formatea una fecha a dd/MM/yyyy HH:mm:ss hrs.
     * @author hvillegassepulveda, Gustavo Villegas, Technisys Chile.
     * @param fecha
     * @return fecha formateada
     */
    public static String formatDateVoucher(Date fecha) {
        if ((fecha != null) && !fecha.equals("")) {
            return DATE_FORMATTER_DAY_MONTH_YEAR_HH_MM_SS.format(fecha) + HRS;
        }

        return "";
    }
	
	/**
 * @EESPINOZA    
 * @param number
 * @return
 * NOTA:funciona OK para numeros grandes, deja en formato MIL sin ningun decimal, ejemplo devuelve: 55.136.785
 */
public static String formatMiles(String number) {
		
		if(number == null || "null".equals(number) || number.trim().length() <= 0){
			
			return "0";
		}
		Locale defaultLocale = Locale.getDefault();
		NumberFormat formato = NumberFormat.getInstance(Locale.GERMAN);
		BigDecimal big = new BigDecimal(number);
		big = big.setScale(0, RoundingMode.HALF_UP);
		Locale.setDefault(defaultLocale);
		return formato.format(big.longValue());
	}
	/**
	*@EESPINOZA    
	*/
	public static Long getNumberSinDecimal(String number){
		
		if(number == null || number.trim().length() <= 0){
			return new Long(0);
		}
		BigDecimal big = new BigDecimal(number);
		big = big.setScale(0, RoundingMode.HALF_UP);
		return big.longValue();
	}
	public static String formatter(Long number, NumberFormat formatter){
		return formatter.format(number); 	
	}
	
	/**
	*@lbenavides
	*MEtodo que formatea los numeros de tarjeta de credito
	*segun el formato 0000-0001-2345-6789  
	*/
	 public static String formatNroTarjetaCredito(String numTarjeta) {
	    	
	    	if (numTarjeta==null || numTarjeta.trim().length() == 0)
	    		return "";     	
			
	    	if (numTarjeta.length()==8)
	    		return "0000-"+numTarjeta.substring(0, 4)+"-"+numTarjeta.substring(4, 8);
	    	
	    	if (numTarjeta.length()==9)    		
	    		return "0000-000"+numTarjeta.substring(0, 1)+"-"+numTarjeta.substring(1, 5)+"-"+numTarjeta.substring(5,9);
			
	    	return "";
	    	// "XXXX XXXX XXXX " + DF4.format(Long.parseLong(tarjetaCredito.getNumeroTarjeta()));
	    }
	 
		/**
		*@jlanezan
		*MEtodo que formatea los numeros de tarjeta de credito
		*segun el formato 0000-0000-0000-6789. Solo se visualizan los 
		*ultimos 4 digitos del numero de tarjeta.  
		*/
		 public static String enmascararNumeroTarjetaCredito(String numTarjeta) {
		    	
		    	if (numTarjeta==null || numTarjeta.trim().length() == 0)
		    		return "";     	
				
	    		return "0000-0000-0000-" +numTarjeta.substring(numTarjeta.length()-4, numTarjeta.length());
		    	
		    }

}
